ํ๋ ๊ฐ๋ฐํ์ ์ํ ํ์ฅ ๊ฐ๋ฅํ๊ณ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์น ์ปดํฌ๋ํธ ์ธํ๋ผ๋ฅผ ์ค๊ณ, ๊ตฌ์ถ, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ์ฒญ์ฌ์ง.
์น ์ปดํฌ๋ํธ ์ธํ๋ผ: ๊ธ๋ก๋ฒ ๊ธฐ์ ์ ์ํ ์๋ฒฝํ ๊ตฌํ ๊ฐ์ด๋
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์์ ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ๋ฏธ๋ ์งํฅ์ ์ธ ํ๋ฐํธ์๋ ์ํคํ ์ฒ๋ฅผ ์ถ๊ตฌํ๋ ๊ฒ์ ๋์์๋ ๋์ ์ ๋๋ค. ํ๋ ์์ํฌ๋ ๋ํ๋ฌ๋ค ์ฌ๋ผ์ง๊ณ , ๊ฐ๋ฐํ์ ์ฑ์ฅํ๊ณ ๋ค์ํด์ง๋ฉฐ, ์ ํ ํฌํธํด๋ฆฌ์ค๋ ๋ค์ํ ๊ธฐ์ ์ ๊ฑธ์ณ ํ์ฅ๋ฉ๋๋ค. ๋๊ท๋ชจ ์กฐ์ง์ ๋จ์ผ์ ๋ชจ๋๋ฆฌ์ ๊ธฐ์ ์คํ์ ๊ฐํ์ง ์๊ณ ์ด๋ป๊ฒ ํต์ผ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค๊ณ ๊ฐ๋ฐ์ ๊ฐ์ํํ ์ ์์๊น์? ํด๋ต์ ๊ฐ๋ ฅํ ์น ์ปดํฌ๋ํธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์์ต๋๋ค.
์ด๊ฒ์ ๋จ์ํ ๋ช ๊ฐ์ง ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋์ด์ญ๋๋ค. ์ ์ธ๊ณ ํ๋ค์ด ๊ณ ํ์ง์ ์ผ๊ด์ฑ ์๊ณ ์ํธ ์ด์ฉ ๊ฐ๋ฅํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํ๋ ๋๊ตฌ, ํ๋ก์ธ์ค ๋ฐ ํ์ค์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์ ๋น๋ ๊ธฐ๊ณ, ์ฆ ์ ์ฒด ์ํ๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ด ๊ฐ์ด๋๋ ์ํคํ ์ฒ ์ค๊ณ๋ถํฐ ๋ฐฐํฌ ๋ฐ ๊ฑฐ๋ฒ๋์ค์ ์ด๋ฅด๊ธฐ๊น์ง ์ด๋ฌํ ์ธํ๋ผ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์๋ฒฝํ ์ฒญ์ฌ์ง์ ์ ๊ณตํฉ๋๋ค.
์ฒ ํ์ ๊ธฐ๋ฐ: ์ ์น ์ปดํฌ๋ํธ์ ํฌ์ํด์ผ ํ๋๊ฐ?
๊ธฐ์ ์ ์ธ ๊ตฌํ์ ๋ฐ์ด๋ค๊ธฐ ์ ์ ์น ์ปดํฌ๋ํธ์ ์ ๋ต์ ๊ฐ์น๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ๋ ๋ ๋ค๋ฅธ ํ๋ฐํธ์๋ ํธ๋ ๋๊ฐ ์๋๋ผ, W3C์ ์ํด ํ์คํ๋ ์น ํ๋ซํผ API ์ธํธ๋ก, ์์ ํ ์บก์ํ๋ ์๋ก์ด HTML ํ๊ทธ๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฐ์ ๋ชจ๋ ๋๊ท๋ชจ ๊ธฐ์ ์ ์ธ ๊ฐ์ง ํ์ ์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
1. ์ง์ ํ ์ํธ ์ด์ฉ์ฑ ๋ฐ ํ๋ ์์ํฌ ๋ ๋ฆฝ์ฑ
์ฃผ์ ์ ์์๊ฑฐ๋ ์ฌ์ดํธ์๋ React๋ฅผ, ๋ด๋ถ CRM์๋ Angular๋ฅผ, ๋ง์ผํ ๋ง์ดํฌ๋ก์ฌ์ดํธ์๋ Vue.js๋ฅผ, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ์ Svelte๋ก ํ๋กํ ํ์ ์ ์ ์ํ๋ ๊ธ๋ก๋ฒ ๊ธฐ์ ์ ์์ํด ๋ณด์ธ์. React๋ก ๊ตฌ์ถ๋ ์ ํต์ ์ธ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค๋ฅธ ํ์๊ฒ๋ ์ธ๋ชจ๊ฐ ์์ต๋๋ค. ์น ์ปดํฌ๋ํธ๋ ์ด๋ฌํ ์ฌ์ผ๋ก๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค. ๋ธ๋ผ์ฐ์ ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋จ์ผ ์น ์ปดํฌ๋ํธ๋ ์ด๋ค ํ๋ ์์ํฌ์์๋, ๋๋ ์ ํ ํ๋ ์์ํฌ ์์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๊ถ๊ทน์ ์ธ ์ฝ์์ ๋๋ค: ํ ๋ฒ ์์ฑํ๊ณ , ์ด๋์๋ ์คํํ๋ผ.
2. ๋์งํธ ์์ฐ์ ๋ฏธ๋ ๋ณด์ฅ
ํ๋ฐํธ์๋ ์ธ๊ณ๋ 'ํ๋ ์์ํฌ ์ดํ'์ ์๋ฌ๋ฆฝ๋๋ค. ์ค๋ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ด์ผ์ ๋ ๊ฑฐ์๊ฐ ๋ ์๋ ์์ต๋๋ค. ์ ์ฒด UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํน์ ํ๋ ์์ํฌ์ ๋ฌถ๋๋ค๋ ๊ฒ์ ๋ฏธ๋์ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ๊ณ ํต์ค๋ฌ์ด ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฐ์ํด์ผ ํ๋ค๋ ์๋ฏธ์ ๋๋ค. ์น ์ปดํฌ๋ํธ๋ ๋ธ๋ผ์ฐ์ ํ์ค์ด๊ธฐ ๋๋ฌธ์ HTML, CSS, JavaScript ์์ฒด์ ์๋ช ์ ๊ฐ์ง๋๋ค. ์ค๋ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํฌ์๋ 10๋ ์ด์ ๊ฐ์น๋ฅผ ์ ์งํ๋ฉฐ, ์ด๋ค ๋จ์ผ JavaScript ํ๋ ์์ํฌ์ ์๋ช ๋ณด๋ค ์ค๋ ์ง์๋ ํฌ์์ ๋๋ค.
3. ์๋ DOM์ ํตํ ๊นจ์ง์ง ์๋ ์บก์ํ
์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋ถ๋ถ์์ ์ ์ญ CSS ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ค๋ฅธ ๋ถ๋ถ์ UI๊ฐ ์ฐ์ฐํ ๊นจ์ง ๊ฒฝ์ฐ๊ฐ ์ผ๋ง๋ ๋ง์์ต๋๊น? ์น ์ปดํฌ๋ํธ ์ฌ์์ ํต์ฌ ๋ถ๋ถ์ธ ์๋ DOM์ด ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์๋ DOM์ ์ปดํฌ๋ํธ์ ์์ฒด ๋ฒ์ ์คํ์ผ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ์ฌ ์ปดํฌ๋ํธ์ ๋น๊ณต๊ฐ ์บก์ํ๋ DOM ํธ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌ์กฐ์ ์คํ์ผ์ด ์ธ๋ถ๋ก๋ถํฐ ๋ณดํธ๋์ด, ์ด๋์ ๋ฐฐ์น๋๋ ์ค๊ณ๋ ๋๋ก ๋ณด์ด๊ณ ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฌํ ์์ค์ ์บก์ํ๋ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์์ด ํ๋๋ฅผ ๋ฐ๊ฟ ๋งํ ๊ธฐ๋ฅ์ ๋๋ค.
์ํคํ ์ฒ ์ฒญ์ฌ์ง: ์ธํ๋ผ ์ค๊ณ
์ฑ๊ณต์ ์ธ ์น ์ปดํฌ๋ํธ ์ธํ๋ผ๋ ๋จ์ํ ์ปดํฌ๋ํธ ํด๋ ๊ทธ ์ด์์ ๋๋ค. ์ด๋ ์๋ก ์ฐ๊ฒฐ๋ ๋ถ๋ถ๋ค๋ก ๊ตฌ์ฑ๋ ์ฌ๋ ค ๊น๊ฒ ์ค๊ณ๋ ์์คํ ์ ๋๋ค. ์ข ์์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ๊ณ ํจํค์ง ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด Nx, Turborepo, Lerna์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ธ๋ ํฌ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ทน ๊ถ์ฅํฉ๋๋ค.
๋ชจ๋ ธ๋ ํฌ์ ํต์ฌ ํจํค์ง
- ๋์์ธ ํ ํฐ: ์๊ฐ์ ์ธ์ด์ ๊ธฐ๋ฐ์ ๋๋ค. ์ด ํจํค์ง์๋ ์ด๋ค ์ปดํฌ๋ํธ๋ ํฌํจ๋์ด์๋ ์ ๋ฉ๋๋ค. ๋์ , ๋์์ธ ๊ฒฐ์ ์ ๋ฐ์ดํฐ(์: JSON ๋๋ YAML ํ์)๋ก ๋ด๋ณด๋ ๋๋ค. ์์, ํ์ดํฌ๊ทธ๋ํผ ์ค์ผ์ผ, ๊ฐ๊ฒฉ ๋จ์, ์ ๋๋ฉ์ด์ ํ์ด๋ฐ ๋ฑ์ ์๊ฐํ ์ ์์ต๋๋ค. Style Dictionary์ ๊ฐ์ ๋๊ตฌ๋ ์ด๋ฌํ ํ ํฐ์ ๋ค์ํ ํ์(CSS ์ปค์คํ ์์ฑ, Sass ๋ณ์, JavaScript ์์)์ผ๋ก ์ปดํ์ผํ์ฌ ๋ชจ๋ ํ๋ก์ ํธ์์ ์๋นํ ์ ์๋๋ก ํฉ๋๋ค.
- ํต์ฌ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ค์ ์น ์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ๋ ์์คํ ์ ํต์ฌ์ ๋๋ค. ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ก ๊ตฌ์ถ๋๋ฉฐ, ์คํ์ผ๋ง์ ์ํด ๋์์ธ ํ ํฐ์ ์๋นํฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก CSS ์ปค์คํ ์์ฑ์ ํตํด).
- ํ๋ ์์ํฌ ๋ํผ (์ ํ ์ฌํญ์ด์ง๋ง ๊ถ์ฅ): ์น ์ปดํฌ๋ํธ๊ฐ ํ๋ ์์ํฌ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํ์ง๋ง, ํนํ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋๋ ๋ณต์กํ ๋ฐ์ดํฐ ์ ํ ์ ๋ฌ๊ณผ ๊ด๋ จํ์ฌ ๊ฐ๋ฐ์ ๊ฒฝํ์ด ๋๋๋ก ํฌ๋ฐํ ์ ์์ต๋๋ค. ์์ ๋ํผ ํจํค์ง(์: `my-components-react`, `my-components-vue`)๋ฅผ ์์ฑํ๋ฉด ์ด ๊ฒฉ์ฐจ๋ฅผ ํด์ํ์ฌ ์ปดํฌ๋ํธ๊ฐ ํ๋ ์์ํฌ ์ํ๊ณ์ ์์ ํ ๋ค์ดํฐ๋ธํ ๋๋์ ์ฃผ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ผ๋ถ ์น ์ปดํฌ๋ํธ ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ธฐ๋ ํฉ๋๋ค.
- ๋ฌธ์ ์ฌ์ดํธ: ์ธ๊ณ์ ์์ค์ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ธ๊ณ์ ์์ค์ ๋ฌธ์ ์์ด๋ ์ธ๋ชจ๊ฐ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ ํ๋ธ ์ญํ ์ ํ๋ ๋ ๋ฆฝ ์คํํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค(์: Storybook, Docusaurus ๋๋ ์ฌ์ฉ์ ์ง์ Next.js ์ฑ์ผ๋ก ๊ตฌ์ถ). ์ธํฐ๋ํฐ๋ธ ํ๋ ์ด๊ทธ๋ผ์ด๋, API ๋ฌธ์(ํ๋กญ, ์ด๋ฒคํธ, ์ฌ๋กฏ), ์ฌ์ฉ ๊ฐ์ด๋๋ผ์ธ, ์ ๊ทผ์ฑ ์ฐธ๊ณ ์ฌํญ ๋ฐ ๋์์ธ ์์น์ ํฌํจํด์ผ ํฉ๋๋ค.
๋๊ตฌ ์ ํ: ํ๋์ ์ธ ์น ์ปดํฌ๋ํธ ์คํ
๋ฐ๋๋ผ JavaScript๋ก ์น ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์๋ ์์ง๋ง, ์ ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฐ์ฑ, ์ฑ๋ฅ ๋ฐ ์ ์ง ๋ณด์์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ปดํ์ผ๋ฌ
- Lit: ์น ์ปดํฌ๋ํธ ๊ตฌ์ถ์ ์ํ Google์ ๊ฐ๋จํ๊ณ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ ๋๋ง์ ์ํด JavaScript ํ๊ทธ ์ง์ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ๊น๋ํ๊ณ ์ ์ธ์ ์ธ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ต์ํ์ ์ค๋ฒํค๋๋ก ์ฑ๋ฅ์ ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ์ ํ์ ๋๋ค.
- Stencil.js: ํ์ค์ ์ค์ํ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๊ฐ๋ ฅํ ์ปดํ์ผ๋ฌ์ ๋๋ค. Stencil์ JSX, TypeScript ์ง์, ํจ์จ์ ์ธ ๋ ๋๋ง์ ์ํ ๊ฐ์ DOM, ์ฌ์ ๋ ๋๋ง(SSR), ํ๋ ์์ํฌ ๋ํผ ์๋ ์์ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํตํด ๋ ํ๋ ์์ํฌ์ ์ ์ฌํ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ํฌ๊ด์ ์ธ ์ํฐํ๋ผ์ด์ฆ ์ธํ๋ผ์ ๊ฒฝ์ฐ Stencil์ด ์ข ์ข ์ต๊ณ ์ ํ๋ณด์ ๋๋ค.
- ๋ฐ๋๋ผ JavaScript: ๊ฐ์ฅ ์์ํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์์ ํ ์ ์ด๊ถ์ ์ ๊ณตํ๋ฉฐ ์ข ์์ฑ์ด ์์ง๋ง, ์์ฑ, ํน์ฑ ๋ฐ ์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด ์ฝ๋ฐฑ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ ๋ง์ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ํ๋ฅญํ ํ์ต ๋๊ตฌ์ด์ง๋ง ๋๊ท๋ชจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ํจ์จ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
์คํ์ผ๋ง ์ ๋ต
์บก์ํ๋ ์๋ DOM ๋ด์์ ์คํ์ผ๋งํ๋ ค๋ฉด ๋ค๋ฅธ ์ฌ๊ณ ๋ฐฉ์์ด ํ์ํฉ๋๋ค.
- CSS ์ปค์คํ ์์ฑ: ์ด๋ ํ ๋ง ์ ์ฉ์ ์ํ ์ฃผ์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๋์์ธ ํ ํฐ ํจํค์ง๋ ํ ํฐ์ ์ปค์คํ ์์ฑ(์: `--color-primary`)์ผ๋ก ๋ ธ์ถํด์ผ ํฉ๋๋ค. ์ปดํฌ๋ํธ๋ ์ด๋ฌํ ๋ณ์(`background-color: var(--color-primary)`)๋ฅผ ์ฌ์ฉํ์ฌ, ์๋น์๊ฐ ๋ ๋์ ์์ค์์ ์์ฑ์ ์ฌ์ ์ํจ์ผ๋ก์จ ์ปดํฌ๋ํธ์ ์ฝ๊ฒ ํ ๋ง๋ฅผ ์ ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
- CSS ์๋ ํํธ (`::part`): ์๋ DOM์ด ์บก์ํ๋๋ ๋ฐ๋ ์ด์ ๊ฐ ์์ง๋ง, ๋๋ก๋ ์๋น์๊ฐ ์ปดํฌ๋ํธ์ ํน์ ๋ด๋ถ ์์๋ฅผ ์คํ์ผ๋งํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. `::part()` ์์ฌ ์์๋ ์๋ ๊ฒฝ๊ณ๋ฅผ ๋ซ๋ ์ ์ด๋๊ณ ๋ช ์์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ปดํฌ๋ํธ ์์ฑ์๋ ํํธ(์: `
๊ตฌํ ์ฌ์ธต ๋ถ์: ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ฒํผ ๊ตฌ์ถ
์ด๋ฅผ ๊ตฌ์ฒดํํด ๋ด
์๋ค. Stencil.js์ ์ ์ฌํ ํด์ฒด์ธ์ ๊ฐ์ ํ๊ณ `
1. ๊ณต๊ฐ API ์ ์ (์์ฑ ๋ฐ ํน์ฑ)
๋จผ์ ์์ฑ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ API๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ฌํ ์์ฑ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ ์ธํ๊ธฐ ์ํด ์ข ์ข ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
// Stencil.js์ ์ ์ฌํ ๋ฌธ๋ฒ ์ฌ์ฉ @Prop() variant: 'primary' | 'secondary' | 'ghost' = 'primary'; @Prop() size: 'small' | 'medium' | 'large' = 'medium'; @Prop() disabled: boolean = false; @Prop({ reflect: true }) iconOnly: boolean = false; // reflect: true๋ prop์ HTML ํน์ฑ๊ณผ ๋๊ธฐํํฉ๋๋ค.
2. ์ฌ์ฉ์ ์ํธ ์์ฉ ์ฒ๋ฆฌ (์ด๋ฒคํธ)
์ปดํฌ๋ํธ๋ ํ์ค DOM ์ด๋ฒคํธ๋ฅผ ํตํด ์ธ๋ถ์ ํต์ ํด์ผ ํฉ๋๋ค. ๋ ์ ์ ์ธ ์ฝ๋ฐฑ์ ํผํ๊ณ , ์ด๋ฒคํธ ์ด๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํฉ๋๋ค.
@Event() myClick: EventEmitter<MouseEvent>; private handleClick = (event: MouseEvent) => { if (!this.disabled) { this.myClick.emit(event); } }
์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ๊ฐ `{ composed: true, bubbles: true }`์ ํจ๊ป ์ ๋ฌ๋์ด ์๋ DOM ๊ฒฝ๊ณ๋ฅผ ๋์ด ํ๋ ์์ํฌ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋ค์ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
3. ์ฌ๋กฏ์ ์ด์ฉํ ์ฝํ ์ธ ํฌ์ ํ์ฑํ
๋ฒํผ ๋ ์ด๋ธ๊ณผ ๊ฐ์ ์ฝํ
์ธ ๋ฅผ ํ๋์ฝ๋ฉํ์ง ๋ง์ญ์์ค. `
// ์ปดํฌ๋ํธ์ ๋ ๋๋ง ํจ์ ๋ด๋ถ (JSX ์ฌ์ฉ) <button class="button"> <slot name="icon-leading" /> <!-- ์์ด์ฝ์ ์ํ ๋ช ๋ช ๋ ์ฌ๋กฏ --> <span class="label"> <slot /> <!-- ๋ฒํผ ํ ์คํธ๋ฅผ ์ํ ๊ธฐ๋ณธ ์ฌ๋กฏ --> </span> </button> // ์๋น์ ์ฌ์ฉ๋ฒ: // <my-button>Click Me</my-button> // <my-button><my-icon slot="icon-leading" name="download"></my-icon>Download File</my-button>
4. ์ ๊ทผ์ฑ (A11y) ์ฐ์ ์์
์ ๊ทผ์ฑ์ ์ ํ ์ฌํญ์ด ์๋๋๋ค. ๋ฒํผ์ ๊ฒฝ์ฐ ๋ค์์ ์๋ฏธํฉ๋๋ค:
- ๋ด๋ถ์ ์ผ๋ก ๋ค์ดํฐ๋ธ `